package com.clouddms.repository;

import com.clouddms.entity.Backup;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 备份数据访问层接口
 */
@Repository
public interface BackupRepository extends JpaRepository<Backup, Long> {

    /**
     * 根据文件ID查找备份
     * @param fileId 文件ID
     * @return 备份列表
     */
    List<Backup> findByFileId(Long fileId);

    /**
     * 根据备份类型查找备份
     * @param backupType 备份类型
     * @return 备份列表
     */
    List<Backup> findByBackupType(String backupType);

    /**
     * 根据创建时间范围查找备份
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 备份列表
     */
    List<Backup> findByCreatedAtBetween(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 查找指定文件的最新备份
     * @param fileId 文件ID
     * @return 最新备份
     */
    @Query("SELECT b FROM Backup b WHERE b.fileId = :fileId ORDER BY b.createdAt DESC")
    Optional<Backup> findLatestBackupByFileId(@Param("fileId") Long fileId);

    /**
     * 统计备份总数
     * @return 备份总数
     */
    long count();

    /**
     * 统计备份总大小
     * @return 备份总大小
     */
    @Query("SELECT COALESCE(SUM(b.backupSize), 0) FROM Backup b")
    Long sumTotalBackupSize();

    /**
     * 根据备份类型统计数量
     * @param backupType 备份类型
     * @return 备份数量
     */
    long countByBackupType(String backupType);

    /**
     * 查找过期的备份（早于指定时间）
     * @param expiredBefore 过期时间
     * @return 过期备份列表
     */
    @Query("SELECT b FROM Backup b WHERE b.createdAt < :expiredBefore ORDER BY b.createdAt ASC")
    List<Backup> findExpiredBackups(@Param("expiredBefore") LocalDateTime expiredBefore);

    /**
     * 根据备份哈希查找备份
     * @param backupFileHash 备份文件哈希
     * @return 备份对象
     */
    Optional<Backup> findByBackupFileHash(String backupFileHash);
}